package com.music.controller;

import com.music.service.UserService;
import com.music.service.JwtService;
import com.music.vo.LoginResponse;
import com.music.vo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户控制器，处理用户相关的REST API请求
 */
@RestController
@RequestMapping("/api/user")
public class UserController {
    @Autowired
    UserService userService;

    @Autowired
    JwtService jwtService;

    /**
     * 用户注册接口
     * @param user 包含用户名、密码、手机号等信息的用户对象
     * @return 注册结果（成功/失败）
     */
    @PostMapping("/register")
    public ResponseEntity<?> register(@RequestBody User user) {
        // 验证用户名唯一性
        if (userService.selectByUsername(user.getUsername()) != null) {
            return ResponseEntity.badRequest().body("用户名已存在");
        }
        userService.register(user);
        return ResponseEntity.ok("注册成功");
    }

    /**
     * 用户登录接口
     * @param user 包含用户名和密码的用户对象
     * @return 包含JWT Token和用户信息的登录响应
     */
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        User authenticatedUser = userService.login(user.getUsername(), user.getPassword());
        // 生成 JWT Token
        String token = jwtService.generateToken(authenticatedUser);
        return ResponseEntity.ok(new LoginResponse(token, authenticatedUser));
    }

    /**
     * 手机号和密码登录接口
     * @param user 包含手机号和密码的用户对象
     * @return 包含JWT Token和用户信息的登录响应
     */
    @PostMapping("/loginByPhone")
    public ResponseEntity<?> loginByPhone(@RequestBody User user) {
        User authenticatedUser = userService.loginByPhone(user.getPhoneNumber(), user.getPassword());
        // 生成 JWT Token
        String token = jwtService.generateToken(authenticatedUser);
        return ResponseEntity.ok(new LoginResponse(token, authenticatedUser));
    }

    /**
     * 更新用户信息接口（需携带Token）
     * @param user 包含用户ID和更新字段的用户对象
     * @param token 用户认证Token
     * @return 更新结果（成功/失败）
     */
    @PutMapping("/update")
    public ResponseEntity<?> updateUser(@RequestBody User user,
                                        @RequestHeader("Authorization") String token) {
        // 验证 Token 有效性
        Integer userId = jwtService.getUserIdFromToken(token);
        user.setUserId(userId);
        userService.updateUser(user);
        return ResponseEntity.ok("更新成功");
    }

    /**
     * 处理头像上传的接口
     * @param file 上传的头像文件
     * @param token 用户认证Token
     * @return 上传结果
     */
    @PostMapping("/updateAvatar")
    public ResponseEntity<Map<String, Object>> updateAvatar(
            @RequestParam("avatar") MultipartFile file,
            @RequestHeader("Authorization") String token) {

        Map<String, Object> response = new HashMap<>();
        try {
            // 从Token中获取用户ID
            Integer userId = jwtService.getUserIdFromToken(token);
            String avatarUrl = userService.updateAvatar(file, userId);
            response.put("success", true);
            response.put("avatarUrl", avatarUrl);
            return ResponseEntity.ok(response);
        } catch (IOException e) {
            response.put("success", false);
            response.put("message", "头像上传失败：" + e.getMessage());
            return ResponseEntity.badRequest().body(response);
        } catch (RuntimeException e) {
            response.put("success", false);
            response.put("message", e.getMessage());
            return ResponseEntity.badRequest().body(response);
        }
    }

    /**
     * 用户退出登录接口
     * @param token 需要失效的JWT Token（从请求头获取）
     * @return 退出结果
     */
    @PostMapping("/logout")
    public ResponseEntity<?> logout(@RequestHeader("Authorization") String token) {
        // 从Authorization头中提取实际Token（去除"Bearer "前缀）
        String actualToken = token.replace("Bearer ", "");

        // 调用JWT服务将Token加入黑名单
        jwtService.invalidateToken(actualToken);

        // 返回成功响应（可根据需要返回数据结构）
        return ResponseEntity.ok(
                Map.of(
                        "code", 200,
                        "message", "退出成功",
                        "timestamp", System.currentTimeMillis()
                )
        );
    }


    // 新增管理员相关接口
    /**
     * 获取所有用户列表接口（管理员权限）
     * @param token 用户认证Token
     * @return 所有用户列表或错误信息
     */
    @GetMapping("/allUsers")
    public ResponseEntity<?> getAllUsers(@RequestHeader("Authorization") String token) {
        Integer userId = jwtService.getUserIdFromToken(token);
        // 简单假设用户ID为1的是管理员，实际应使用更安全的权限管理方式
        if (userId == 1) {
            List<User> users = userService.selectAllUsers();
            return ResponseEntity.ok(users);
        } else {
            return ResponseEntity.status(403).body("无权限访问");
        }
    }

    /**
     * 冻结用户接口（管理员权限）
     * @param token 用户认证Token
     * @param userId 要冻结的用户ID
     * @return 操作结果
     */
    @PutMapping("/freeze/{userId}")
    public ResponseEntity<?> freezeUser(@RequestHeader("Authorization") String token, @PathVariable Integer userId) {
        Integer currentUserId = jwtService.getUserIdFromToken(token);
        // 简单假设用户ID为1的是管理员，实际应使用更安全的权限管理方式
        if (currentUserId == 1) {
            userService.freezeUser(userId);
            return ResponseEntity.ok("用户已冻结");
        } else {
            return ResponseEntity.status(403).body("无权限操作");
        }
    }

    /**
     * 解冻用户接口（管理员权限）
     * @param token 用户认证Token
     * @param userId 要解冻的用户ID
     * @return 操作结果
     */
    @PutMapping("/unfreeze/{userId}")
    public ResponseEntity<?> unfreezeUser(@RequestHeader("Authorization") String token, @PathVariable Integer userId) {
        Integer currentUserId = jwtService.getUserIdFromToken(token);
        // 简单假设用户ID为1的是管理员，实际应使用更安全的权限管理方式
        if (currentUserId == 1) {
            userService.unfreezeUser(userId);
            return ResponseEntity.ok("用户已解冻");
        } else {
            return ResponseEntity.status(403).body("无权限操作");
        }
    }
}